home *** CD-ROM | disk | FTP | other *** search
- 10 ! ***********************************************************
- 20 ! Example: Passwords
- 30 !
- 40 ! This program demonstrates the operation of the STRING input widget
- 50 ! by creating a password panel that prompts the user for a name and
- 60 ! password. The program asks you for a name and password before it
- 70 ! brings up the panel.
- 80 !
- 90 ! ************************************************************
- 100 !
- 110 CLEAR SCREEN
- 120 OPTION BASE 1
- 130 !
- 140 ! Goodname is a flag that says a valid name has been obtained and
- 150 ! a password should be input. Done indicates a valid name and
- 160 ! password have been input.
- 170 !
- 180 INTEGER Goodname,Done
- 190 Goodname=0
- 200 Done=0
- 210 !
- 220 ! Strings Used:
- 230 !
- 240 ! Name$: Stores user name for matching later
- 250 ! Pass$: Stores user password for matching later
- 260 ! Inval$: Input value from STRING widgets
- 270 ! B$: General-purpose buffer
- 280 !
- 290 DIM Name$[80],Pass$[80],Inval$[80],B$[80]
- 300 !
- 310 ! Get name and password
- 320 !
- 330 INPUT "Please Input Your Name:",Name$
- 340 INPUT "Please Input a Password:",Pass$
- 350 !
- 360 DISP "Building Panel, Please Wait"
- 370 !
- 380 ! Define colors
- 390 !
- 400 INTEGER Black,White,Red,Blue
- 410 Black=0
- 420 White=1
- 430 Red=2
- 440 Blue=6
- 450 !
- 460 ! Get display dimensions
- 470 !
- 480 INTEGER A(6),Nlines
- 490 REAL Dw,Dh,Vh
- 500 GESCAPE CRT,3;A(*) ! Get screen size
- 510 Dw=A(3)-A(1)+1
- 520 Dh=A(4)-A(2)+1
- 530 STATUS CRT,13;Nlines ! Get number of lines of text on display
- 540 Vh=Dh*(1-6/Nlines) ! Height of display above DISP line
- 550 !
- 560 REAL Px,Py,Pw,Ph,Ih,Iw
- 570 Pw=330 ! Main PANEL width
- 580 Ph=260 ! Main PANEL height
- 590 Px=(Dw-Pw)/2 ! Center PANEL along width
- 600 Py=(Vh-Ph)/2 ! Place above DISP line
- 610 !
- 620 ! Build main PANEL
- 630 !
- 640 ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0) ! Make invisible
- 650 CONTROL @Main;SET ("MAXIMIZABLE":0,"RESIZABLE":0)
- 660 CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":Pw,"HEIGHT":Ph)
- 670 CONTROL @Main;SET ("TITLE":" Example: Passwords")
- 680 CONTROL @Main;SET ("SYSTEM MENU":"Quit")
- 690 ON EVENT @Main,"SYSTEM MENU" GOTO Finis
- 700 !
- 710 ! Get inside dimensions of PANEL
- 720 !
- 730 STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
- 740 !
- 750 ! Set up dimensions for widgets
- 760 !
- 770 REAL Gapw,Gaph,Wh,Ww1,Ww2
- 780 REAL R1,R2,R3,R4,R5,C1,C2
- 790 !
- 800 ! Set dimensions for interior widgets
- 810 !
- 820 Gapw=Iw*.02 ! Horizontal gap
- 830 Gaph=Ih*.02 ! Vertical gap
- 840 !
- 850 Wh=Ih*.16 ! Height of all child widgets
- 860 Ww1=Iw*.70 ! Width of STRING widgets and their LABELs
- 870 Ww2=Iw-Gapw*2 ! Width of prompt LABEL
- 880 !
- 890 R1=Gaph ! Row position of LABEL for name-input STRING
- 900 R2=R1+Wh ! Row position of name-input STRING
- 910 R3=R2+Wh+Gaph ! Row position of LABEL for password-input STRING
- 920 R4=R3+Wh ! Row position of password-input STRING
- 930 R5=R4+Wh ! Bottom of password-input STRING
- 940 R6=((Ih-R5)-Wh)/2+R5 ! Row of prompt LABEL (centered at bottom)
- 950 !
- 960 C1=(Iw-Ww2)/2 ! Column position of prompt LABEL
- 970 C2=(Iw-Ww1)/2 ! Column position of STRINGs and their LABELs
- 980 !
- 990 ! Create LABEL for name-input STRING (no border, blends with PANEL)
- 1000 !
- 1010 ASSIGN @Lbl1 TO WIDGET "LABEL";PARENT @Main
- 1020 CONTROL @Lbl1;SET ("X":C2,"Y":R1,"WIDTH":Ww1,"HEIGHT":Wh)
- 1030 CONTROL @Lbl1;SET ("BORDER":0)
- 1040 CONTROL @Lbl1;SET ("FONT":"8 BY 16,BOLD")
- 1050 CONTROL @Lbl1;SET ("VALUE":" Enter your name:")
- 1060 !
- 1070 ! Create name-input STRING
- 1080 !
- 1090 ASSIGN @Str1 TO WIDGET "STRING";PARENT @Main
- 1100 CONTROL @Str1;SET ("X":C2,"Y":R2,"WIDTH":Ww1,"HEIGHT":Wh)
- 1110 CONTROL @Str1;SET ("BACKGROUND":Black,"PEN":Red)
- 1120 CONTROL @Str1;SET ("FONT":"8 BY 16")
- 1130 CONTROL @Str1;SET ("VALUE":"")
- 1140 !
- 1150 ! Create LABEL for password-input STRING
- 1160 !
- 1170 ASSIGN @Lbl2 TO WIDGET "LABEL";PARENT @Main
- 1180 CONTROL @Lbl2;SET ("X":C2,"Y":R3,"WIDTH":Ww1,"HEIGHT":Wh)
- 1190 CONTROL @Lbl2;SET ("BORDER":0)
- 1200 CONTROL @Lbl2;SET ("FONT":"8 BY 16,BOLD")
- 1210 CONTROL @Lbl2;SET ("VALUE":" Enter your password:")
- 1220 !
- 1230 ! Create STRING for password-input STRING. Both the background
- 1240 ! and font are black so the user cannot see what is typed in.
- 1250 ! A font type is not set, since it cannot be seen.
- 1260 !
- 1270 ASSIGN @Str2 TO WIDGET "STRING";PARENT @Main
- 1280 CONTROL @Str2;SET ("X":C2,"Y":R4,"WIDTH":Ww1,"HEIGHT":Wh)
- 1290 CONTROL @Str2;SET ("BACKGROUND":Black,"PEN":Red,"PASSWORD CHARACTER":"*")
- 1300 CONTROL @Str2;SET ("VALUE":"")
- 1310 !
- 1320 ! Create prompt LABEL
- 1330 !
- 1340 ASSIGN @Lbl3 TO WIDGET "LABEL";PARENT @Main
- 1350 CONTROL @Lbl3;SET ("X":C1,"Y":R6,"WIDTH":Ww2,"HEIGHT":Wh)
- 1360 CONTROL @Lbl3;SET ("FONT":"7 BY 14")
- 1370 CONTROL @Lbl3;SET ("BACKGROUND":Blue,"PEN":White)
- 1380 GOSUB Setprompt
- 1390 !
- 1400 ! Set up events. EVENTS are set up on the password STRING for both
- 1410 ! each KEYSTROKE and when Return is pressed, allowing a handler
- 1420 ! routine to generate a BEEP every time a key is pressed (for
- 1430 ! feedback, since you cannot see what you are typing) and allowing
- 1440 ! another handler routine to take the entire password when Return
- 1450 ! is pressed.
- 1460 !
- 1470 ON EVENT @Str1,"RETURN" GOSUB Getname
- 1480 ON EVENT @Str2,"RETURN" GOSUB Getpass
- 1490 !
- 1500 CLEAR SCREEN
- 1510 CONTROL @Main;SET ("VISIBLE":1)
- 1520 !
- 1530 ! Main loop, wait for event
- 1540 !
- 1550 LOOP
- 1560 IF Done=1 THEN Finis
- 1570 END LOOP
- 1580 !
- 1590 ! *********** End of Main Program *******************
- 1600 !
- 1610 ! This routine puts the standard prompt
- 1620 ! in the prompt LABEL
- 1630 !
- 1640 Setprompt: !
- 1650 B$="Please enter name, then password."
- 1660 GOSUB Setlabel
- 1670 RETURN
- 1680 !
- 1690 ! This routine puts a string passed to it through B$ in the
- 1700 ! prompt LABEL
- 1710 !
- 1720 Setlabel: !
- 1730 CONTROL @Lbl3;SET ("VALUE":B$)
- 1740 RETURN
- 1750 !
- 1760 ! This routine is invoked when Enter is pressed after inputting a
- 1770 ! name in the name-input STRING. First, it tests to see if a name
- 1780 ! has already been input. If so, it outputs a message and exits.
- 1790 !
- 1800 ! Otherwise, it checks the input value for a match with the password.
- 1810 ! If it does not match, it gives a warning message and sets Goodname
- 1820 ! to 0.
- 1830 !
- 1840 ! If it does match, it changes the prompt to ask for a password only.
- 1850 ! In either case, it clears the STRING.
- 1860 !
- 1870 Getname: !
- 1880 DISABLE
- 1890 STATUS @Str1;RETURN ("VALUE":Inval$)
- 1900 IF Goodname=1 THEN
- 1910 BEEP 2000,.01
- 1920 B$="Please enter password"
- 1930 GOSUB Setlabel
- 1940 ELSE
- 1950 IF Inval$<>Name$ THEN
- 1960 BEEP 2000,.1
- 1970 B$="Invalid name"
- 1980 GOSUB Setlabel
- 1990 GOSUB Setprompt
- 2000 Goodname=0
- 2010 ELSE
- 2020 B$="Name accepted, please enter password."
- 2030 GOSUB Setlabel
- 2040 Goodname=1
- 2050 END IF
- 2060 END IF
- 2070 CONTROL @Str1;SET ("VALUE":"")
- 2080 ENABLE
- 2090 RETURN
- 2100 !
- 2110 ! This routine checks for a valid password. First, it checks
- 2120 ! to see if the user has provided a valid name. If not, it beeps
- 2130 ! and tells the user to input a valid name.
- 2140 !
- 2150 ! Otherwise, it tries to match the input string against the password.
- 2160 ! If no match, it tells the user and returns. If it matches, it also
- 2170 ! tells the user and sets a flag to tell the main routine it is done.
- 2180 !
- 2190 Getpass: !
- 2200 DISABLE
- 2210 IF Goodname=0 THEN
- 2220 BEEP 2000,.01
- 2230 B$="Please input your name first."
- 2240 GOSUB Setlabel
- 2250 WAIT 2
- 2260 GOSUB Setprompt
- 2270 ELSE
- 2280 STATUS @Str2;RETURN ("VALUE":Inval$)
- 2290 IF Inval$<>Pass$ THEN
- 2300 BEEP 2000,.01
- 2310 B$="Invalid password, try again."
- 2320 GOSUB Setlabel
- 2330 CONTROL @Str2;SET ("VALUE":"")
- 2340 ELSE
- 2350 B$="Welcome to the club!"
- 2360 GOSUB Setlabel
- 2370 WAIT 10
- 2380 Done=1
- 2390 END IF
- 2400 END IF
- 2410 ENABLE
- 2420 RETURN
- 2430 !
- 2440 Finis: !
- 2450 ASSIGN @Panel TO * ! Delete PANEL widget
- 2460 END
-